﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace QuizAppMvc2
{
    /// <summary>
    /// Summary description for WebService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class WebService : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public int AddNewSimpleQuestion(string materia, string topico, string subtopico, string texto, Boolean certo)
        {
            quizdbEntities db = new quizdbEntities();


            Filter filter = CheckFilter(materia, topico, subtopico, db);
            QuestaoSimple qs = db.Questaos.OfType<QuestaoSimple>().Where(m => m.Texto.Contains(texto) && m.idMateria == filter.materiaid).FirstOrDefault();
            if ( qs != null) 
            {
                return 0;
            }


            QuestaoSimple simples = new QuestaoSimple();
            simples.DataCriacao = DateTime.Now;
            simples.Gabarito = certo ? 1 : 2;
            simples.Texto = texto;
            simples.TipoQuestao = 1;
            simples.idTopico = filter.topicoid;
            simples.idSubTopico = filter.subtopicoid;
            simples.idMateria = filter.materiaid;
            db.AddToQuestaos(simples);
            db.SaveChanges();

            return 1;
        }


        [WebMethod]
        public int AddNewMultipleQuestion(string materia, string topico, string subtopico, string texto, int gabarito, List<string> alternativas)
        {
            quizdbEntities db = new quizdbEntities();

            Filter filter = CheckFilter(materia, topico, subtopico, db);


            QuestaoMultipla qm = db.Questaos.OfType<QuestaoMultipla>().Where(m => m.Texto.Contains(texto) && m.idMateria == filter.materiaid).FirstOrDefault();
            if (qm != null) 
            {
                return 0;
            }


            QuestaoMultipla multipla = new QuestaoMultipla();
            multipla.DataCriacao = DateTime.Now;
            multipla.Gabarito = gabarito;
            for (int i = 0; i < alternativas.Count(); i++)
            {
                multipla.QuestaoAlternativas.Add(new QuestaoAlternativa() { Alternativa = i + 1, Texto = alternativas[i] });
            }
            multipla.Texto = texto;
            multipla.TipoQuestao = 2;
            multipla.idTopico = filter.topicoid;
            multipla.idSubTopico = filter.subtopicoid;
            multipla.idMateria = filter.materiaid;
            db.AddToQuestaos(multipla);
            db.SaveChanges();
            return 1;
        }

        public class Filter
        {
            public int materiaid { get; set; }
            public int? topicoid { get; set; }
            public int? subtopicoid { get; set; }
        }


        private Filter CheckFilter(string materia, string topico, string subtopico, quizdbEntities db)
        {

            Materia mymateria = null;
            Topico mytopico = null;
            SubTopico mysubtopico = null;



            mymateria = db.Materias.Where(m => m.Nome == materia).FirstOrDefault();
            if (mymateria == null)
            {
                mymateria = new Materia();
                db.AddToMaterias(new Materia() { Nome = materia });
                db.SaveChanges();
                mymateria = db.Materias.Where(m => m.Nome == materia).FirstOrDefault();

            }


            if (topico != String.Empty)
            {
                mytopico = db.Topicoes.Where(m => m.Nome == topico && m.idMateria == mymateria.idMateria).FirstOrDefault();
                if (mytopico == null)
                {
                    mytopico = new Topico()
                    {
                        Nome = topico,
                        Materia = mymateria
                    };
                    db.AddToTopicoes(mytopico);
                    db.SaveChanges();
                    mytopico = db.Topicoes.Where(m => m.Nome == topico && m.idMateria == mymateria.idMateria).FirstOrDefault();
                }
            }

            if (subtopico != String.Empty)
            {
                mysubtopico = db.SubTopicoes.Where(m => m.Nome == subtopico && m.idMateria == mymateria.idMateria && m.idTopico == mytopico.idTopico).FirstOrDefault();
                if (mysubtopico == null)
                {
                    mysubtopico = new SubTopico()
                    {
                        Nome = subtopico,
                        Topico = mytopico
                        //idMateria = mymateria.idMateria
                    };
                    db.AddToSubTopicoes(mysubtopico);
                    db.SaveChanges();
                }
            }

            Filter filter = new Filter()
            {
                materiaid = mymateria.idMateria,
                topicoid = ((mytopico == null) ? null : (int?)mytopico.idTopico),
                subtopicoid = mysubtopico == null ? null : (int?)mysubtopico.idSubTopico
            };
            return filter;
        }

    }
}
